package com.niit.scala

object Base_08 {



  def main(args: Array[String]): Unit = {
    /*
     模式匹配
        1.简单的模式匹配
        2.匹配类型
        3.模式匹配的守卫
        4.匹配样例类
        5.匹配集合
        6.匹配for循环表达式
     Options类型
     柯里化[了解]
     */
    // 简单的模式匹配  switch - case
    //需求：输入Hadoop或者Spark，分别显示两者的简介信息，如果输入其他的则显示未匹配
    var str = "HBase"
    str match {
      case "Hadoop" => println("大数据分布式存储和计算框架")
      case "Spark" => println("大数据分布式内存计算框架")
      case _ => println("未匹配")
    }
    //匹配类型
    val i:Any = 999
    i match {
      case _:String => println("这是字符串")
      case _:Int => println("这是整数")
      case _:Float => println("这是小数")
      case _ => println("未知类型")
    }
    //模式匹配的守卫
    var num = 3
    num match {
      case num if num>=0 && num <=10 => println("这个数在0-10的范围")
      case num if num>=11 && num <=20 => println("这个数在11-20的范围")
      case _ => println("超过范围")
    }
      //匹配样例类
    val c:Any =Customer("张三",18)
    val o:Any = Order(12345)
    val arr:Any = Array(1,2,3,4)
    c match {
      case Customer(a,b) => println("客户类")
      case Order(a) => println("订单类")
      case _ => println("未知类型")
    }
    //匹配集合 数组/列表/集/元组
    val arr1 = Array(1,2,3)
    val arr2 = Array(0)
    val arr3 = Array(1,2,3,4,5)

    arr1 match {
        //匹配：长度为3，首元素为1
      case Array(1,x,y) => println("长度为3，首元素为1")
        //匹配：只有一个元素，且为0
      case Array(0) => println("有一个元素，且为0")
        //匹配:首元素为1 ，后面元素无所谓
      case Array(1,_*) => println("首元素为1 ，后面元素无所谓")
        //匹配：元素个数为2
      case Array(x,y) => println("元素个数为2")
      case _ => println("未知类型")
    }
    //匹配for表达式
    //定义变量记录学生的姓名和年龄，获得年龄为23的学生信息
    var students = Map(  ("张三",23),("李四",24),("王五",23) )
    for ( (k,23) <- students ){
      println(k,25)
    }

    //Options类型：用来避免空指针，具体值使用Some(x)，空 值使用None
      divide(10,2) match {
        case None => println("除数不能为0")
        case Some(x) => println(s"结果${x}")
      }
  }

  def divide(a:Int,b:Int):Option[Int]={
    if(b ==0){
      None
    }else{
      Some(a/b)
    }
  }


  case class Customer(var name:String,var age:Int)
  case class Order(var id:Int)

}
